
#pragma once

#include "atr/core/boolean.hpp"

namespace atr {
/**
 * @brief   Metaprograming 'equal of types' - false
 * @details Checks if given types are equal. Default value is 'false', because
 *          this is the most probably output when we take 2 random types.
 *
 * @tparam  First type to compare
 * @tparam  Second type (different from first) to compare
 *
 * @todo    Make it possible to use with more than two types (check if all types
 *          are same)
 */
template <class First, class Second>
struct equal
{
    /** Result type */
    using type = core::_false;
};

/**
 * @brief   Metaprograming 'equal of types' - true
 * @details Check if given types are equal. This partial specialization takes
 *          the case, when indead two provided types are equal.
 *
 * @tparam  Type for first and second template argument. In this case there is
 *          only one perceptible type.
 *
 * @todo    Make it possible to use with more than two types (check if all types
 *          are same)
 */
template <class Type>
struct equal<Type,Type>
{
    /** Result type */
    using type = core::_true;
};

} // namespace atr